package com.ceair.config.customizer;

import com.ceair.config.basic.BasicEnumCustomizer;
import com.ceair.enums.BasicEnum;
import io.swagger.v3.oas.models.media.Schema;
import io.swagger.v3.oas.models.parameters.Parameter;
import org.springdoc.core.customizers.ParameterCustomizer;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.MethodParameter;

/**
 * @author wangbaohai
 * @ClassName ApiEnumParameterCustomizer
 * @description: 枚举参数自定义配置
 * @date 2025年02月21日
 * @version: 1.0.0
 */
@Configuration(proxyBeanMethods = false)
public class ApiEnumParameterCustomizer implements ParameterCustomizer, BasicEnumCustomizer {

    /**
     * 自定义参数信息
     *
     * 此方法用于根据方法参数的类型自定义参数信息，特别是针对枚举类型的参数进行特殊处理
     * 它通过检查方法参数是否为枚举类型，如果是，则设置参数的描述和 schema 信息
     *
     * @param parameterModel Swagger 中的参数模型对象，用于生成 API 文档
     * @param methodParameter 方法参数对象，包含参数的类型信息
     * @return 返回自定义后的参数模型对象
     */
    @Override
    public Parameter customize(Parameter parameterModel, MethodParameter methodParameter) {
        // 获取方法参数的类型
        Class<?> parameterType = methodParameter.getParameterType();

        // 枚举处理
        if (BasicEnum.class.isAssignableFrom(parameterType)) {
            // 如果参数类型是枚举，则设置参数的描述信息
            parameterModel.setDescription(getDescription(parameterType));

            // 创建一个 Schema 对象用于定义参数的 schema 信息
            Schema<Object> schema = new Schema<>();
            // 设置 schema 的枚举值
            schema.setEnum(getValues(parameterType));
            // 将 schema 关联到参数模型上
            parameterModel.setSchema(schema);
        }

        // 返回自定义后的参数模型对象
        return parameterModel;
    }

}
